#pragma once

#include <memory>
#include <string>
#include <usbg/usbg.h>
#include "hidbox/hid_device_identifier.h"
#include "hidbox/hid_gadget_descriptor.h"

namespace hidbox {

/**
 * @brief USB Gadget 控制器
 * 负责通过 libusbgx 配置 Linux USB Gadget 设备
 */
class UsbGadget {
public:
    UsbGadget();
    ~UsbGadget();

    /**
     * @brief 获取已配置的设备标识符
     * @return HIDDeviceIdentifier
     */
    [[nodiscard]] HIDDeviceIdentifier GetConfiguredIdentifier() const;

    /**
     * @brief 配置 USB Gadget
     * @param descriptor HID Gadget 描述符
     */
    void Configure(const HIDGadgetDescriptor& descriptor);

    /**
     * @brief 删除所有现有的 Gadget 配置
     */
    void RemoveGadgets();

    /**
     * @brief 设置 Gadget 名称
     * @param name Gadget 名称
     */
    void SetGadgetName(const std::string& name) { gadget_name = name; }

    /**
     * @brief 设置序列号
     * @param serial 序列号
     */
    void SetSerial(const std::string& serial_num) { default_serial = serial_num; }

private:
    std::string gadget_name = "hidbox";
    std::string default_serial = "0";
    usbg_state* u_state{};
    usbg_gadget* u_gadget{};

    void CreateGadget(const HIDGadgetDescriptor& descriptor);
    void CheckExistingGadget(const HIDGadgetDescriptor& descriptor);
    static void PrintDescriptor(const HIDGadgetDescriptor& descriptor);
};

}  // namespace hidbox
